/**
 * 函数工厂
 */

class CommercialBank {
  public address: string = "beijing";
  public name: string = "wangwu";
  static count: number;

  constructor(name: string, address: string) {
    console.log(name, "name");

    this.address = address;
    this.name = name;
  }
  loan(): void {
    console.log(this.name + " 银行贷款");
  }
  test(): CommercialBank {
    return new CommercialBank("w", "w"); // 工厂 返回了自身类型
  }
}

// new 不是创建的意思，而是表示后面的类型是一个类构造函数对象变量的类型【类构造函数的类型】
type constructor = new (...args: any) => any; // 工厂函数类型

// !在ts中 不能直接new一个 函数 来创建实例[对象]
// const t = new test();

// ? 1.工厂函数类型的简单使用

// type constructorType = new (...args: any) => any// 工厂函数类型 构造函数类型

// let Constructor:constructorType = CommercialBank;// 已经new一个构造变量了,所以相当于是CommercialBank类型

// let con1 = new Constructor('广大银河', '广州');
// let con2 = new Constructor('中国银河', '深圳');

//?   2.构建工厂函数

// function createInstanceFactory(Constructor:new (...args: any) => any){
function createInstanceFactory<T>(Constructor: { new (...args: any): T }) {
  // 接口形式
  console.log(Constructor.name, "Constructor.name"); // 打印构建函数的名称

  return new Constructor("储蓄", "gz");
}

const con3 = createInstanceFactory<CommercialBank>(CommercialBank);
con3.loan()
/*
  不使用的话 会类型推断
function createInstanceFactory<CommercialBank>(Constructor: new (...args: any) => CommercialBank): CommercialBank
*/

export {};
